<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        console.log(num); // undefined
        var num = 10;

        // run(); // run is not a function
        var run = function () {
            console.log('run');
        }

        run1();
        function run1() {
            console.log('=====');// =====
        }
        // var 可以重复声明（不推荐）
        // 有声明提升
        // 以函数区分作用域
        var num = 20;
        console.log(num); // 20

        function run2() {
            console.log(num); // 20
            var num = 30;
            console.log(num);// 30
            var n = 100;
        }
        run2();
        // console.log(n); // n is not defined  外部作用域不可以使用内部作用域得变量

        // let 没有声明提升
        // let 的作用域时以{}区分的 块级作用域
        // let不可以重复声明
        // console.log(str); // str is not defined
        let str = '111';
        if (true) {
            let str1 = '222';
            console.log(str1); // 222
        }
        // console.log(str1); // str1 is not defined
        // let str ='333'

        if (true) {
            var num3 = 40;

        }
        console.log(num3); // 40

        // 同步： 代码从上往下一步一步执行，上面代码没有执行完，下边代码不会执行
        // 异步： 代码从上往下，可以让一个需要等到时间的代码同时执行，不影响下边代码的执行


        // index 是全局变量
        // 循环先执行；操作的是唯一的一个index值得更改
        // 在循环执行完后，再次使用index  得到的是更改后的index的值

        for (var index = 0; index < 10; index++) {
            // console.log(index); //
            // 异步执行
            setTimeout(function () {
                console.log(index); //执行完73行才执行
            }, 4)
        }
        console.log('-------------'); // '---------'
        console.log(index); // 10


        for (let b = 0; b < 10; b++) {
            setTimeout(function () {
                console.log(b);

            }, 4);
        }
        console.log('------------', b); //  b is not defined

        /* 
        b 是块级变量
        会先执行循环， 但是每个循环都是一个单独的作用域（对于let来说）

        那么在每个循环体中都会有一个块级变量b的值等于当前b的值
        每个作用域都是独立的
        在循环后来使用b时， 得到的都是当前作用域记录的b的值
        
        
        */
       











    </script>
</body>

</html>